package com.xsd.juc;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;

/**
 * @Description: 流式计算
 * @Author: zhoufuzong
 * @Created: 2021-01-03 16:02:13
 * @Version: 1.1.0
 */

@Data
@NoArgsConstructor
@AllArgsConstructor
class User{
    private Integer id;
    private String userName;
    private int age;


}

/**
 * 题目： 按照给出的数据，找出同时满足以下条件的用户，也即以下条件全部满足
 *   偶数ID ，且年龄大于24，且用户名转为大写且用户名字母排倒叙
 *   只输出一个用户名字
 */

/**
 * 流（Stream) 是数据渠道，用于操作数据源（集合、数组等）所生成的元素序列
 *
 * 集合讲的是数据，流讲的计算
 *
 * 特点：
 *      Stream 自己不会存储元素
 *      Stream不会改变源对象。相反，他们会返回一个持有结果的新Stream。
 *      Stream 操作是延迟执行的。这意味着他们会等到需要结果时才执行
 */

public class StreamDemo {

    public static void main(String[] args) {
        User u1 = new User(11,"a",23);
        User u2 = new User(12,"b",24);
        User u3 = new User(13,"c",22);
        User u4 = new User(14,"d",28);
        User u5 = new User(16,"e",26);

        List<User> list = Arrays.asList(u1,u2,u3,u4,u5);
        list.stream().
                filter(u->{return u.getId()%2==0; })
                .filter(t ->{return t.getAge()>24;})
                .map(t -> {return t.getUserName().toUpperCase();})
                .sorted((o1, o2) -> {return o2.compareTo(o1);})
                .forEach(System.out::println);
    }

    private static void functionDemo() {
        Function<String,Integer> function = s ->{return s.length();};
        System.out.println(function.apply("abc"));

        Predicate<String> predicate = s -> s.isEmpty();
        System.out.println(predicate.test("abc"));

        Consumer<String> consumer =  (s) -> {
            System.out.println(s);
        };

        consumer.accept("abc");

        Supplier<String> stringSupplier =()->{return "abcd";};
        System.out.println(stringSupplier.get());
    }

}
